#ifndef SOCK5_CLIENT_HPP
#define SOCK5_CLIENT_HPP

#include "acceptnewfd.hpp"
#include "connector.hpp"
#include "eventbuffer.hpp"

namespace oraysock5 {
/**
 * @brief sock5客户端连接
*/
class Sock5Client : public AcceptNewFd, public std::enable_shared_from_this<Sock5Client> {
public:
    enum class State {
        INIT,
        CONNECT,
        EXCHANGEDATA,
    };

    /**
     * @brief 构造
     * @param remote_addr db客户端地址
     * @param listen_addr 服务器监听地址
     * @param iobuf 管理io读写缓冲区
    */
    Sock5Client(std::shared_ptr<IPAddress> remote_addr,
        std::shared_ptr<IPAddress> listen_addr,
        std::shared_ptr<EventBuffer> iobuf);
    ~Sock5Client();

    /**
    * @brief 客户端连接断开回调
    * @param active 断开原因 CLIENT_CLOSE,SERVER_CLOSE,TIMEOUT_CLOSE
    */
    void close(CloseType active) override;
    /**
         * @brief 检测到与客户端没有心跳超时回调
         * @param active 断开原因 TIMEOUT_CLOSE
        */
    void timerout(CloseType) override;
    /**
    * @brief socket数据已经保存到管理io缓冲,可以读取回调
    * @return 返回SUCCESS正常没有操作,
    返回INITIATIVE_CLOSE服务器将关闭底层socket，并触发close(CLIENT_CLOSE)
    返回PASSIVE_CLOSE服务器将关闭底层socket，并触发close(SERVER_CLOSE)
    */
    InputResult input() override;

private:
    /**
     * @brief 连接断开原因
    */
    CloseType active_ = CloseType::SERVER_CLOSE;
    /**
     * @brief 当前状态
    */
    State state_ = State::INIT;
    /**
     * @brief 远端服务器连接器
    */
    std::shared_ptr<Connector> connector_;
};
}

#endif
